package com.hongyi.dto;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class Test { // 注意类名通常首字母大写
    public static void main(String[] args) {
        // 给定的北京时间
        LocalDateTime givenTimeBeijing = LocalDateTime.of(2024, 9, 29, 23, 59, 59);

        // 获取当前时间（UTC），然后转换为北京时间
        Instant nowUtc = Instant.now();
        LocalDateTime nowBeijing = nowUtc.atZone(ZoneId.of("Asia/Shanghai")).toLocalDateTime();
        System.out.println("当前北京时间为: "+nowBeijing);

        // 如果你想直接计算两个LocalDateTime之间的差（但这通常不是以秒为单位的）
        // 你需要先将它们转换为同一时区下的Instant，然后计算差
        Instant givenTimeInstant = givenTimeBeijing.atZone(ZoneId.of("Asia/Shanghai")).toInstant();

        // 计算时间差（秒）
        long timeDifferenceInSeconds = ChronoUnit.SECONDS.between(givenTimeInstant, nowUtc.atZone(ZoneId.of("Asia/Shanghai")).toInstant());

        // 注意：由于nowUtc是当前的UTC时间，我们需要再次将其转换为北京时间对应的Instant来进行比较
        // 但实际上，由于我们已经有了nowBeijing，我们可以直接使用它与givenTimeBeijing的Instant进行比较
        // 这样做可以避免不必要的时区转换，并直接得到两个LocalDateTime之间的秒数差（在同一时区下）

        // 更简洁且正确的方法
        long simplerTimeDifferenceInSeconds = ChronoUnit.SECONDS.between(givenTimeBeijing.atZone(ZoneId.of("Asia/Shanghai")).toInstant(), nowBeijing.atZone(ZoneId.of("Asia/Shanghai")).toInstant());

        // 由于我们想要的是从给定时间到当前时间的差（即给定时间应该是较早的那个），我们应该使用abs或确保计算顺序正确
        long absoluteTimeDifferenceInSeconds = Math.abs(simplerTimeDifferenceInSeconds);

        // 打印结果
        System.out.println("从北京时间2024-9-29 23:59:59到当前北京时间的时间差（秒）: " + absoluteTimeDifferenceInSeconds);

        // 注意：由于我们使用了Math.abs，所以结果总是非负的
        // 如果givenTimeBeijing在未来，那么结果将是给定的未来秒数
        // 如果givenTimeBeijing在过去，那么结果将是过去的秒数（但取绝对值后总是非负）
    }
}
